package satb.model;

import java.sql.SQLException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.postgis.Point;
import org.postgis.Polygon;

/**Classe que representa a Área.
* @author Marcel Tolentino Pinheiro de Oliveira.
*/
public class Area
{
    //Atributos
    private int id;
    private int pasture;
    private String name;
    private String minimumTime;
    private Polygon areaCoordinates;
    
    /**Construtor Default*/
    public Area() {}
    
    /**Construtor com um parâmetro. */
    public Area(String area) throws SQLException
    {
        this.areaCoordinates = new Polygon(area);
    }
    
    /**Contrutor com dois parâmetros.
     @param name - o nome da área
     @param inf - a inferência para os pontos dentro da área.*/
    public Area(String name, String time, String area) throws SQLException
    {
        this.name = name;
        this.minimumTime = time;
        this.areaCoordinates = new Polygon(area);
    }   
 
    
    /**Construtor com quatro parâmetros.
     @param pastureid - o id do pasto no banco
     @param name - o nome da área
     @param inf - a inferência para os pontos dentro da área.*/
    public Area(int pastureid, String name, String time) throws SQLException
    {
        this.pasture = pastureid;
        this.name = name;
        this.minimumTime = time;
        this.areaCoordinates = new Polygon();
    }
    
    
    /**Construtor com quatro parâmetros.
     @param pastureid - o id do pasto no banco
     @param name - o nome da área
     @param inf - a inferência para os pontos dentro da área.
     @param area - o valor que iniciarã um Polygon*/
    public Area(int pastureid, String name, String time, String area) throws SQLException
    {
        this.pasture = pastureid;
        this.name = name;
        this.minimumTime = time;
        this.areaCoordinates = new Polygon(area);
    }
    
    
    /**Retorna o valor do atributo id. */
    public int getId()
    {
        return id;
    }
    
    /**Seta o valor do id. */
    public void setId(int id)
    {
        this.id = id;
    }
    
    /**Retorna o valor do atributo pasture. */
    public int getPasture()
    {
        return pasture;
    }
    
    /**Seta o valor de pasture. */
    public void setPasture(int pasture)
    {
        this.pasture = pasture;
    }
    
    /**Retorno o valor do atributo name. */
    public String getName()
    {
        return name;
    }
    
    /**Seta o valor de name. */
    public void setName(String n)
    {
        this.name = n;
    }
    
    /**Retorna o valor do atributo minimumTime. */
    public String getMinimumTime()
    {
        return minimumTime;
    }
    
    /**Seta o valor de minimumTime. */
    public void setMinimumTime (String time)
    {
        this.minimumTime = time;
    }
  
   /**Retorna o valor de areaCoordinates. */
   public Polygon getAreaCoordinates() 
   {
      return areaCoordinates;
   } 
        
   /**Seta o valor de areaCoordinates. */
   public void setAreaCoordinates(Polygon areaCoordinates) 
   {
      this.areaCoordinates = areaCoordinates;
   }
   
   
   /**Retorna os pontos de uma Polygon em uma coleção ObservableList. */
   public ObservableList<Coordinate> getCoordinates()
   {
       ObservableList<Coordinate> coords = FXCollections.observableArrayList();
       int tam = this.areaCoordinates.numPoints();
       
       for(int i = 0; i < tam; i++)
       {
           Point p = areaCoordinates.getPoint(i);
           Coordinate c = new Coordinate (p.getX(), p.getY());
           coords.add(c);
       }
       
       return coords;
   }
   
   
   /**Retorna os pontos de uma Polygon em uma coleção ObservableList. */
   public void setCoordinates(ObservableList<Coordinate> coord) throws SQLException
   {
       Polygon area = new Polygon(getPolygon(coord));
       setAreaCoordinates(area);
            
   }
   

   /**Recebe latitude e longitude e retorna uma coordenada do tipo Geometry.*/     
   private String getPolygon(ObservableList<Coordinate> p)
   {
        String polygon = "POLYGON((";
        int i = 0, tam = p.size();
        
        for(Coordinate c : p)
        {
            i++;
            polygon = polygon.concat(String.valueOf(c.getLongitudeX()));
            polygon = polygon.concat(" ");
            polygon = polygon.concat(String.valueOf(c.getLatitudeY()));
            if(i != tam)
            {
                 polygon = polygon.concat(",");       
            }
        }
        polygon = polygon.concat("))");
        
        return polygon;
   }
}